<!DOCTYPE html>
<html>
  <head>
    <title>
      Test if MediaElementAudioSourceNode works for cross-origin redirects with
      "cors" request mode.
    </title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
    <script src="/webaudio/resources/audit.js"></script>
    <script src="/common/get-host-info.sub.js"></script>
  </head>
  <body>
    <script id="layout-test-code">
      const audit = Audit.createTaskRunner();

      setup(() => {
        const context = new AudioContext();
        context.suspend();

        const host_info = get_host_info();
        const audioElement = document.createElement('audio');
        audioElement.loop = true;
        audioElement.crossOrigin = 'anonymous';
        const wav =
            host_info.HTTPS_ORIGIN + '/webaudio/resources/4ch-440.wav?' +
            'pipe=header(access-control-allow-origin,*)';
        audioElement.src =
            host_info.HTTPS_REMOTE_ORIGIN +
            '/fetch/api/resources/redirect.py?location=' +
            encodeURIComponent(wav);
        let source;
        let workletRecorder;

        audit.define(
            {label: 'setting-up-graph'},
            (task, should) => {
              source = new MediaElementAudioSourceNode(context, {
                mediaElement: audioElement
              });
              workletRecorder = new AudioWorkletNode(
                  context, 'recorder-processor', {channelCount: 4});
              source.connect(workletRecorder).connect(context.destination);
              task.done();
            });

        // The recorded data from MESN must be non-zero. The source file contains
        // 4 channels of sine wave.
        audit.define(
            {label: 'start-playback-and-capture'},
            (task, should) => {
              workletRecorder.port.onmessage = (event) => {
                if (event.data.type === 'recordfinished') {
                  for (let i = 0; i < event.data.recordBuffer.length; ++i) {
                    const channelData = event.data.recordBuffer[i];
                    should(channelData, `Recorded channel #${i}`)
                        .notBeConstantValueOf(0);
                  }
                }

                task.done();
              };

              context.resume();
              audioElement.play();
            });

        Promise.all([
          context.audioWorklet.addModule('/webaudio/js/worklet-recorder.js')
        ]).then(() => {
          audit.run();
        });
      });
    </script>
  </body>
</html>
